package main

import (
	"fmt"
	"strings"
)

func main() {
	//1.有一堆数字，如果除了一个数字以外，其他数字都出现了两次，那么如何找到出现一次的数字？
	//2.求数组[1, 3, 5, 7, 8]所有元素的和
	//3.找出数组中和为指定值的两个元素的下标，比如从数组[1, 3, 5, 7, 8]中找出和为8的两个元素的下标分别为(0,3)和(1,2)。
	//4.写一个程序，统计一个字符串中每个单词出现的次数。比如：”how do you do”中how=1 do=2 you=1。
	//5.观察代码，写出最终的打印结果。

	//1
	fmt.Println("==================1====================")
	//思路：异或运算  a^0 = a  a^a = 0  异或运算有分配律和结合律  因此相同的数一起异或都为0 最后那个值异或0  等于自己
	arr1 := [...]int{1, 3, 1, 3, 6, 5, 2, 7, 8, 7, 8, 2, 6}
	res := 0
	for _, v := range arr1 {
		res ^= v
	}
	fmt.Println(res)
	fmt.Println("==================1====================")

	//2
	fmt.Println("==================2====================")
	sum := 0
	arr2 := [...]int{1, 3, 5, 7, 8}
	for _, v := range arr2 {
		sum += v
	}
	fmt.Println(sum)
	fmt.Println("==================2====================")

	//3
	fmt.Println("==================3====================")
	target := 8
	for i1, v1 := range arr2 {
		for i2, v2 := range arr2 {
			if i1 == i2 || i1 > i2 {
				continue
			}
			if v1+v2 == target {
				fmt.Println(i1, i2)
			}
		}
	}
	fmt.Println("==================3====================")

	//4
	fmt.Println("==================4====================")
	s1 := "how do you do my friend do how you do my dog"

	memo := make(map[string]int, 10)
	words := strings.Split(s1, " ")

	for _, v := range words {
		memo[v]++
	}

	fmt.Println(memo)

	fmt.Println("==================4====================")

	//5
	fmt.Println("==================5====================")

	/* 	func main() {
		type Map map[string][]int
		m := make(Map)
		s := []int{1, 2}
		s = append(s, 3)
		fmt.Printf("%+v\n", s)	//out: [1,2,3] 对
		m["q1mi"] = s
		s = append(s[:1], s[2:]...)
		fmt.Printf("%+v\n", s)	//out:[1,3] 对
		fmt.Printf("%+v\n", m["q1mi"])	//[1,3] 错
	} */

	type Map map[string][]int
	m := make(Map)
	s := []int{1, 2}
	s = append(s, 3)
	fmt.Printf("%+v\n", s)         //在%v的基础上额外输出字段名	[1,2,3]
	m["q1mi"] = s                  //slice将底层数组的引用传递给了map
	s = append(s[:1], s[2:]...)    //slice删去index1  相当于len-1  后面的元素全部往前移动  覆盖掉index1的元素
	fmt.Printf("%+v\n", s)         //[1,3]
	fmt.Printf("%+v\n", m["q1mi"]) //[1,3,3]
	//原来的slice长度-1  但是map中存的slice长度没变  而且和原slice指向同一片数组  所以是[1,3,3]

	fmt.Println("==================5====================")
}
